/*
 *  Plan.h
 *  Ray Tracing
 *
 *  Created by Jean-Marc Comby + Romain Dequesne on Mon Apr 12 2004.
 *  Copyright (c) 2004. All rights reserved.
 *
 *
 *  Modelisation des plans
 */

#ifndef _PLAN_H
#define _PLAN_H

#include "Forme.hpp"

#include "boost/shared_ptr.hpp"

/**
 * Classe implémentant le plan pour le raytracing. Le plan est définit
 * dans les coordonnées globales. Le plan est donné par un point et un
 * vecteur normal.
 *
 * Un point est considéré comme "à l'intérieur" du Plan s'il se trouve
 * du côté opposé à la direction du vecteur normal.
 *
 * Forme::baryCentre est défini comme le point par lequel passe le
 * plan.
 *
 * @author Jean-Marc Comby
 * @author Romain Dequesne
 * @author Johan "Solo" Luisier
 *
 * @date 12 Avril 2004
 */
class Plan : public Forme
{
 public:
  /** Alias pour définir un pointeur intelligent.
   *
   * Ce type permet une auto-destruction du Plan créé.
   */
  typedef boost::shared_ptr< Plan > SharedPtr;
  //constructeurs et destructeurs
  Plan();
  Plan(const Vecteur& v, const Coord& a);
  Plan(const Coord& a, const Coord& b, const Coord& c);
  //constructeurs de copie
  Plan(const Plan& plan);
  ~Plan();
  bool aIntersection( const Rayon& rayon ) const;
  Coord trouveIntersection(const Rayon&) const;
  //renvoie le point d intersection
  VecteurU normale(const Coord& coord) const;
  //renvoie la normale
  bool estDans(const Coord& coord) const;
  //revoie true si le point est dans le plan... en fait sous la plan (projection strict. <0)
  bool estSur(const Coord& coord) const;
  //renvoie true si le point est sur le plan
	
  // le mappping du plan ce fait sur le plan (y,z)
  void mapping(const Coord& pt, int &i, int &j, const int &frequence, const int &Hauteur, const int &Largeur) const;
	
  // methode get
  const VecteurU& vecteurnormal() const;
  const Coord& point() const;
  std::ostream& affiche(std::ostream& os) const;
  Coord intrinseque(const Coord& pt) const;
 private:
  /**
   * Vecteur normal au plan.
   */
  VecteurU VecteurNormal;
  /**
   * Un point du plan.
   */
  Coord Point;
};

#endif
